package org.aspire.core.config;

import org.aspire.core.Config;

/******************************************************************************
 * A game configuration with added settings exclusive for 2D games made for the
 * Personal Computer (PC) platform.
 * 
 * @author JPACarabuena
 *****************************************************************************/
public interface PCConfig extends Config {
	
	// ========================================================================
	// Final Fields
	// ========================================================================

	// ========================================================================
	// Getters & Setters
	// ========================================================================

	/**************************************************************************
	 * Checks if FullScreen Exclusive Mode is enabled.
	 * 
	 * @return Whether or not the display is in FullScreen Exclusive Mode.
	 *************************************************************************/
	public boolean isFullScreenExclusiveModeEnabled();
	
	/**************************************************************************
	 * Checks if BufferStrategy is enabled in hardware-accelerated graphics
	 * powered rendering utility.
	 * 
	 * @return Whether or not the rendering utility will use buffered strategy.
	 *************************************************************************/
	public boolean isBufferStrategyEnabled();
	
	/**************************************************************************
	 * Checks if OpenGL is enabled.
	 * 
	 * @return 
	 * 		Whether or not OpenGL will be used instead of a hardware-
	 * 		accelerated graphics as the rendering utility.
	 *************************************************************************/
	public boolean isOpenGLEnabled();
	
	/**************************************************************************
	 * Checks if VSync is enabled in OpenGL powered rendering utility.
	 * 
	 * @return Whether or not the rendering utility will use VSync.
	 *************************************************************************/
	public boolean isVSyncEnabled();
	
	/**************************************************************************
	 * Checks if the mouse is enabled as an input device.
	 * 
	 * @return Whether or not the mouse will be used as an input device.
	 *************************************************************************/
	public boolean isMouseEnabled();
	
	/**************************************************************************
	 * Checks if the keyboard is enabled as an input device.
	 * 
	 * @return Whether or not the keyboard will be used as an input device.
	 *************************************************************************/
	public boolean isKeyboardEnabled();
	
	/**************************************************************************
	 * Checks if the joystick is enabled as an joystick device.
	 * 
	 * @return Whether or not the joystick will be used as an input device.
	 *************************************************************************/
	public boolean isJoystickEnabled();
	
	/**************************************************************************
	 * Checks if precise loop controller is enabled instead of the standard
	 * loop controller.
	 * 
	 * @return	Whether or not precise loop controller is enabled.
	 *************************************************************************/
	public boolean isPreciseLoopControllerEnabled();
	
	/**************************************************************************
	 * @return
	 *************************************************************************/
	public Class<?> getBaseClass();
	
	/**************************************************************************
	 * Enable or disable displaying in FullScreen Exclusive Mode.
	 * 
	 * @param fullscreen 
	 * 				whether or not the display is in FullScreen Exclusive Mode.
	 *************************************************************************/
	public void enableFullScreenExclusiveMode(boolean fullscreen);
	
	/**************************************************************************
	 * Enable or disable using buffer strategy in hardware-accelerated graphics
	 * utility. 
	 * 
	 * @param bufferStrategy
	 * 				whether or not hardware-accelerated graphics uses buffer
	 * 				strategy for creating back buffer.
	 *************************************************************************/
	public void enableBufferStrategy(boolean bufferStrategy);
	
	/**************************************************************************
	 * Enable or disable using OpenGL for rendering objects to the screen.
	 * 
	 * @param openGL
	 * 				whether or not OpenGL will be used for rendering objects
	 * 				to the screen instead of hardware-accelerated graphics.
	 *************************************************************************/
	public void enableOpenGL(boolean openGL);
	
	/**************************************************************************
	 * Enable or disable using VSync in OpenGL rendering utility.
	 * 
	 * @param vSync
	 * 				whether or not the VSync is enabled in the OpenGL rendering
	 * 				utility.
	 *************************************************************************/
	public void enableVSync(boolean vSync);
	
	/**************************************************************************
	 * Enable or disable the use of mouse as an input device.
	 * 
	 * @param mouse	whether or not to use mouse as an input device.
	 *************************************************************************/
	public void enableMouse(boolean mouse);
	
	/**************************************************************************
	 * Enable or disable the use of keyboard as an input device.
	 * 
	 * @param keyboard whether or not to use keyboard as an input device.
	 *************************************************************************/
	public void enableKeyboard(boolean keyboard);
	
	/**************************************************************************
	 * Enable or disable the use of joystick as an input device.
	 * 
	 * @param joystick	whether or not to use joystick as an input device.
	 *************************************************************************/
	public void enableJoystick(boolean joystick);
	
	/**************************************************************************
	 * Enable or disable the use of precise loop controller.
	 * 
	 * @param precise	whether or not to use precise loop controller.
	 *************************************************************************/
	public void enablePreciseLoopController(boolean precise);

	/**************************************************************************
	 * @param base
	 *************************************************************************/
	public void setBaseClass(Class<?> base);
	
	// ========================================================================
	// Override Methods
	// ========================================================================

	// ========================================================================
	// Methods
	// ========================================================================

	// ========================================================================
	// Inner & Anonymous Classes
	// ========================================================================
}